This page follows fastai ’ s quickstart page by quickly showing a few learning tasks . More will be added here as they are added to the library .
FastAI . jl ’ s learning tasks all use the same basic steps and code:
create a data container
create a learning task
create learner
call a fit task
make predictions or view results
In this quick start, we ’ ll show these steps for a wide range of difference applications and datasets . As you ’ ll see, the code in each case is extremely similar, despite the very different models and data being used .
]activate .
[32m[1m Activating[22m[39m environment at `~/.julia/dev/FastAI/notebooks/Project.toml`
import CairoMakie
using FastAI
┌ Info: Precompiling CairoMakie [13f3f980-e62b-5c42-98c6-ff1f3baf88f0]
└ @ Base loading.jl:1342
┌ Info: Precompiling FastAI [5d0beca9-ade8-49ae-ad0b-a3cf890e669f]
└ @ Base loading.jl:1342
WARNING: using Makie.Label in module FastAI conflicts with an existing identifier.
data, blocks = loaddataset("imagenette2-320", (Image, Label))
task = ImageClassificationSingle(blocks, size=(256, 256))
learner = tasklearner(task, data, callbacks=[ToGPU(), Metrics(accuracy)])
fitonecycle!(learner, 5, 0.033)
[32mEpoch 1 TrainingPhase(): 100%|██████████████████████████| Time: 0:04:25[39mm
┌───────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼─────────┼──────────┤
│ TrainingPhase │ 1.0 │ 1.97242 │ 0.39778 │
└───────────────┴───────┴─────────┴──────────┘
[32mEpoch 1 ValidationPhase(): 100%|████████████████████████| Time: 0:00:14[39m
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 1.0 │ 1.48969 │ 0.5269 │
└─────────────────┴───────┴─────────┴──────────┘
[32mEpoch 2 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:56[39m
┌───────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼─────────┼──────────┤
│ TrainingPhase │ 2.0 │ 1.32481 │ 0.57116 │
└───────────────┴───────┴─────────┴──────────┘
[32mEpoch 2 ValidationPhase(): 100%|████████████████████████| Time: 0:00:05[39m
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 2.0 │ 1.29609 │ 0.58396 │
└─────────────────┴───────┴─────────┴──────────┘
[32mEpoch 3 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:56[39m
┌───────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼─────────┼──────────┤
│ TrainingPhase │ 3.0 │ 1.07732 │ 0.65053 │
└───────────────┴───────┴─────────┴──────────┘
[32mEpoch 3 ValidationPhase(): 100%|████████████████████████| Time: 0:00:04[39m
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 3.0 │ 0.84394 │ 0.73269 │
└─────────────────┴───────┴─────────┴──────────┘
[32mEpoch 4 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:56[39m
┌───────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼─────────┼──────────┤
│ TrainingPhase │ 4.0 │ 0.76976 │ 0.75464 │
└───────────────┴───────┴─────────┴──────────┘
[32mEpoch 4 ValidationPhase(): 100%|████████████████████████| Time: 0:00:04[39m
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 4.0 │ 0.63991 │ 0.79958 │
└─────────────────┴───────┴─────────┴──────────┘
[32mEpoch 5 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:55[39m
┌───────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼─────────┼──────────┤
│ TrainingPhase │ 5.0 │ 0.54532 │ 0.82431 │
└───────────────┴───────┴─────────┴──────────┘
[32mEpoch 5 ValidationPhase(): 100%|████████████████████████| Time: 0:00:04[39m
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 5.0 │ 0.53793 │ 0.82539 │
└─────────────────┴───────┴─────────┴──────────┘
showoutputs(task, learner)
data, blocks = loaddataset("pascal_2007", (Image, LabelMulti))
task = ImageClassificationMulti(blocks)
learner = tasklearner(task, data, callbacks=[ToGPU(), Metrics(accuracy_thresh)])
fitonecycle!(learner, 5, 0.033)
[32mEpoch 1 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:09[39m
┌───────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├───────────────┼───────┼─────────┼─────────────────┤
│ TrainingPhase │ 1.0 │ 0.36548 │ 0.8588 │
└───────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 1 ValidationPhase(): 100%|████████████████████████| Time: 0:00:01[39m
┌─────────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├─────────────────┼───────┼─────────┼─────────────────┤
│ ValidationPhase │ 1.0 │ 0.25181 │ 0.92066 │
└─────────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 2 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:08[39m
┌───────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├───────────────┼───────┼─────────┼─────────────────┤
│ TrainingPhase │ 2.0 │ 0.23486 │ 0.92187 │
└───────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 2 ValidationPhase(): 100%|████████████████████████| Time: 0:00:00[39m
┌─────────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├─────────────────┼───────┼─────────┼─────────────────┤
│ ValidationPhase │ 2.0 │ 0.24972 │ 0.91715 │
└─────────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 3 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:08[39m
┌───────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├───────────────┼───────┼─────────┼─────────────────┤
│ TrainingPhase │ 3.0 │ 0.22395 │ 0.92288 │
└───────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 3 ValidationPhase(): 100%|████████████████████████| Time: 0:00:00[39m
┌─────────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├─────────────────┼───────┼─────────┼─────────────────┤
│ ValidationPhase │ 3.0 │ 0.21873 │ 0.92184 │
└─────────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 4 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:08[39m
┌───────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├───────────────┼───────┼─────────┼─────────────────┤
│ TrainingPhase │ 4.0 │ 0.20917 │ 0.92587 │
└───────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 4 ValidationPhase(): 100%|████████████████████████| Time: 0:00:00[39m
┌─────────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├─────────────────┼───────┼─────────┼─────────────────┤
│ ValidationPhase │ 4.0 │ 0.20198 │ 0.9268 │
└─────────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 5 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:08[39m
┌───────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├───────────────┼───────┼─────────┼─────────────────┤
│ TrainingPhase │ 5.0 │ 0.19368 │ 0.929 │
└───────────────┴───────┴─────────┴─────────────────┘
[32mEpoch 5 ValidationPhase(): 100%|████████████████████████| Time: 0:00:00[39m
┌─────────────────┬───────┬─────────┬─────────────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy_thresh [0m│
├─────────────────┼───────┼─────────┼─────────────────┤
│ ValidationPhase │ 5.0 │ 0.19307 │ 0.92859 │
└─────────────────┴───────┴─────────┴─────────────────┘
showoutputs(task, learner)
data, blocks = loaddataset("camvid_tiny", (Image, Mask))
task = ImageSegmentation(blocks)
learner = tasklearner(task, data, callbacks=[ToGPU()])
fitonecycle!(learner, 10, 0.1)
[32mEpoch 1 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:01[39m
┌───────────────┬───────┬────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼────────┤
│ TrainingPhase │ 1.0 │ 3.5564 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 1.0 │ 3.69546 │
└─────────────────┴───────┴─────────┘
[32mEpoch 2 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 2.0 │ 3.07527 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 2.0 │ 161.498 │
└─────────────────┴───────┴─────────┘
[32mEpoch 3 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 3.0 │ 2.51556 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 3.0 │ 70.3467 │
└─────────────────┴───────┴─────────┘
[32mEpoch 4 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼────────┤
│ TrainingPhase │ 4.0 │ 1.9643 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 4.0 │ 4.44282 │
└─────────────────┴───────┴─────────┘
[32mEpoch 5 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 5.0 │ 1.77354 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 5.0 │ 2.79239 │
└─────────────────┴───────┴─────────┘
[32mEpoch 6 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 6.0 │ 1.70444 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 6.0 │ 2.10786 │
└─────────────────┴───────┴─────────┘
[32mEpoch 7 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:01[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 7.0 │ 1.66732 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 7.0 │ 1.80765 │
└─────────────────┴───────┴─────────┘
[32mEpoch 8 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 8.0 │ 1.64187 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 8.0 │ 1.74117 │
└─────────────────┴───────┴─────────┘
[32mEpoch 9 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 9.0 │ 1.60915 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 9.0 │ 1.69404 │
└─────────────────┴───────┴─────────┘
[32mEpoch 10 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:02[39m
┌───────────────┬───────┬─────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 10.0 │ 1.61496 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│
├─────────────────┼───────┼────────┤
│ ValidationPhase │ 10.0 │ 1.6875 │
└─────────────────┴───────┴────────┘
showoutputs(task, learner)
data, blocks = loaddataset("adult_sample", (TableRow, Label))
task = TabularClassificationSingle(blocks, data)
learner = tasklearner(task, data; callbacks=[Metrics(accuracy)], batchsize=128)
fitonecycle!(learner, 3, 0.2)
┌ Warning: There is a missing value present for category 'occupation' which will be removed from Categorify dict
└ @ DataAugmentation /home/lorenz/.julia/dev/DataAugmentation/src/rowtransforms.jl:108
[32mEpoch 1 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:03[39m
┌───────────────┬───────┬────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼────────┼──────────┤
│ TrainingPhase │ 1.0 │ 0.3823 │ 0.82343 │
└───────────────┴───────┴────────┴──────────┘
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 1.0 │ 0.31932 │ 0.85017 │
└─────────────────┴───────┴─────────┴──────────┘
[32mEpoch 2 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:03[39m
┌───────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼─────────┼──────────┤
│ TrainingPhase │ 2.0 │ 0.34991 │ 0.83775 │
└───────────────┴───────┴─────────┴──────────┘
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 2.0 │ 0.37026 │ 0.83396 │
└─────────────────┴───────┴─────────┴──────────┘
[32mEpoch 3 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:03[39m
┌───────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├───────────────┼───────┼─────────┼──────────┤
│ TrainingPhase │ 3.0 │ 0.32316 │ 0.85015 │
└───────────────┴───────┴─────────┴──────────┘
[32mEpoch 3 ValidationPhase(): 100%|████████████████████████| Time: 0:00:00[39m
┌─────────────────┬───────┬─────────┬──────────┐
│[1m Phase [0m│[1m Epoch [0m│[1m Loss [0m│[1m Accuracy [0m│
├─────────────────┼───────┼─────────┼──────────┤
│ ValidationPhase │ 3.0 │ 0.30751 │ 0.85229 │
└─────────────────┴───────┴─────────┴──────────┘
showoutputs(task, learner, backend=ShowText())
┌─────────────────────────────────────────────────────────────┬──────────────────────────────────┐
│[1m Encoded sample [0m│[1m Output [0m│
├─────────────────────────────────────────────────────────────┼──────────────────────────────────┤
│ ┌──────────────────────┬──────────────────────────────────┐[0m │ [90m┌ ┐[39m [0m │
│ │ EncodedTableRow(...)[0m │ [90m┌ ┐[39m [0m │[0m │ [0m>=50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■[39m[0m 0.701 [90m [39m [0m │
│ │ │ [0m>=50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■■■[39m[0m 1.0 [90m [39m [0m │[0m │ [0m<50k [90m┤[39m[38;5;2m■■■■■■[39m[0m 0.299 [90m [39m [0m │
│ │ │ [0m<50k [90m┤[39m[0m 0.0 [90m [39m [0m │[0m │ [90m└ ┘[39m [0m │
│ │ │ [90m└ ┘[39m [0m │[0m │ │
│ └──────────────────────┴──────────────────────────────────┘[0m │ │
│ [0m │ │
├─────────────────────────────────────────────────────────────┼──────────────────────────────────┤
│ ┌──────────────────────┬──────────────────────────────────┐[0m │ [90m┌ ┐[39m [0m │
│ │ EncodedTableRow(...)[0m │ [90m┌ ┐[39m [0m │[0m │ [0m>=50k [90m┤[39m[38;5;2m■■[39m[0m 0.117 [90m [39m [0m │
│ │ │ [0m>=50k [90m┤[39m[0m 0.0 [90m [39m [0m │[0m │ [0m<50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■[39m[0m 0.883 [90m [39m [0m │
│ │ │ [0m<50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■■■[39m[0m 1.0 [90m [39m [0m │[0m │ [90m└ ┘[39m [0m │
│ │ │ [90m└ ┘[39m [0m │[0m │ │
│ └──────────────────────┴──────────────────────────────────┘[0m │ │
│ [0m │ │
├─────────────────────────────────────────────────────────────┼──────────────────────────────────┤
│ ┌──────────────────────┬──────────────────────────────────┐[0m │ [90m┌ ┐[39m [0m │
│ │ EncodedTableRow(...)[0m │ [90m┌ ┐[39m [0m │[0m │ [0m>=50k [90m┤[39m[38;5;2m■[39m[0m 0.0429 [90m [39m [0m │
│ │ │ [0m>=50k [90m┤[39m[0m 0.0 [90m [39m [0m │[0m │ [0m<50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■[39m[0m 0.957 [90m [39m [0m │
│ │ │ [0m<50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■■■[39m[0m 1.0 [90m [39m [0m │[0m │ [90m└ ┘[39m [0m │
│ │ │ [90m└ ┘[39m [0m │[0m │ │
│ └──────────────────────┴──────────────────────────────────┘[0m │ │
│ [0m │ │
├─────────────────────────────────────────────────────────────┼──────────────────────────────────┤
│ ┌──────────────────────┬──────────────────────────────────┐[0m │ [90m┌ ┐[39m [0m │
│ │ EncodedTableRow(...)[0m │ [90m┌ ┐[39m [0m │[0m │ [0m>=50k [90m┤[39m[0m 0.0141 [90m [39m [0m │
│ │ │ [0m>=50k [90m┤[39m[0m 0.0 [90m [39m [0m │[0m │ [0m<50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■[39m[0m 0.986 [90m [39m [0m │
│ │ │ [0m<50k [90m┤[39m[38;5;2m■■■■■■■■■■■■■■■[39m[0m 1.0 [90m [39m [0m │[0m │ [90m└ ┘[39m [0m │
│ │ │ [90m└ ┘[39m [0m │[0m │ │
│ └──────────────────────┴──────────────────────────────────┘[0m │ │
│ [0m │ │
└─────────────────────────────────────────────────────────────┴──────────────────────────────────┘
The following pages link back here: